import java.util.Arrays;
import java.util.ArrayList;

public class sumaMinima{
	//private static int minimo = 0;
	public static void main (String[] args){
		//int [] numbers = {8,-10,10,-51,-2,3};
		int [] romina = {-1,2,1,3,2};
		ArrayList <int []> subSec = new ArrayList <int []> ();
		//subsecuencia(numbers,0,numbers.length,subSec);
		subsecuencia(romina,0,romina.length,subSec);		
		int [] minima = analizar(subSec);
		System.out.print("La subsecuencia de suma minima es: ");
		imprimir(minima);	
	}


	private static int [] analizar (ArrayList <int []> subsecuencia) {
		int [] res = {};		
		int sumaMin = 0;		
		if (subsecuencia.size() > 0) {
			res = subsecuencia.get(0); // asumo que la subsecuencia de suma minima es el primer array contenido en el ArrayList
			sumaMin = suma(res); 
			for (int i=0; i<subsecuencia.size(); i++) {
				int [] aux = subsecuencia.get(i);
				int suma_actual = suma(aux);				
				if (suma_actual < sumaMin) {
					sumaMin = suma_actual;
					res = aux;	
				}
			}
			System.out.println("La suma minima es: " + sumaMin);
			return res;		
		}
		else 
			return res;	
	}
	
	private static int suma (int [] array) {
		int res = 0;		
		for (int i=0; i<array.length; i++)
			res = res + array[i];
		return res;		
	}
	
	private static void imprimir (int [] array) {		
		for (int i=0; i<array.length; i++)
			System.out.print(array[i] + " ");
		System.out.println();		
	}

	public static void subsecuencia (int [] array, int desde, int hasta, ArrayList <int []> subsecuencias) {
		if (desde < hasta) {	
			int [] aux = Arrays.copyOfRange(array,desde,hasta);				
			if (!(subsecuencias.contains(aux))) // la subsecuencia actual no esta en la lista de subsecuencias
				subsecuencias.add(aux);
			subsecuencia(array,desde+1,hasta,subsecuencias);
			subsecuencia(array,desde,hasta-1,subsecuencias);
		}
	}
}
